package pe.com.bbva.ge.vista.vaadin.ui.utileria;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import pe.com.bbva.ge.domain.configuracion.Denominacion;

import com.vaadin.event.FieldEvents.BlurEvent;
import com.vaadin.event.FieldEvents.BlurListener;
import com.vaadin.ui.TextField;

public class ManejadorDivisa implements BlurListener {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5159906044937992666L;

	private Map<Denominacion, ManejadorDenominacion2> mpDenominaciones;
	
	private TextField txtTotalDivisa;
	private TextField txtDiferencial;
	
	private boolean modoCrear;	

	private Invocador invocador;
	
	public ManejadorDivisa(TextField txtTotalDivisa, TextField txtDiferencial) {
		mpDenominaciones = new HashMap<Denominacion, ManejadorDenominacion2>();
		this.txtTotalDivisa = txtTotalDivisa;
		this.txtDiferencial = txtDiferencial;
		
		this.txtTotalDivisa.setValue("0.0");
		this.txtDiferencial.setValue("0.0");
		
		this.txtTotalDivisa.setImmediate(true);
		this.txtTotalDivisa.setEnabled(true);
		
		this.txtDiferencial.setImmediate(false);
		this.txtDiferencial.setEnabled(false);
		
		this.txtTotalDivisa.addListener(this);
		
	}

	public void agregarManejadorDenominacion(Denominacion denominacion, ManejadorDenominacion2 manejadorDenominacion)
	{
		if(!mpDenominaciones.containsKey(denominacion))
		{
			mpDenominaciones.put(denominacion, manejadorDenominacion);
		}
	}
	
	@Override
	public void blur(BlurEvent event) {
		if(event.getSource().equals(this.txtTotalDivisa))
		{
			setInvocador(Invocador.DIVISA);
			calcularTotalDivisa();
		}
	}

	public void calcularTotalDivisa() {
		
		BigDecimal bdTotalSumDenominacion = new BigDecimal("0.0");
		
		Set<Entry<Denominacion, ManejadorDenominacion2>> entrySetDenominaciones = mpDenominaciones.entrySet();
		Iterator<Entry<Denominacion, ManejadorDenominacion2>> iteratorDenominaciones = entrySetDenominaciones.iterator();
		while (iteratorDenominaciones.hasNext()) {
			Map.Entry<Denominacion, ManejadorDenominacion2> entry = (Map.Entry<Denominacion, ManejadorDenominacion2>) iteratorDenominaciones
					.next();
			
			BigInteger cantidadDen = entry.getValue().getCantidadYDeteriorado();
			/*BigInteger cantidadDen2 = entry.getValue().getCantidad();
			System.out.println(entry.getKey().getMoneda().getCodigo() + ">" +entry.getKey().getValor() + ">" + cantidadDen + "-"+cantidadDen2);
			*/
			BigDecimal bdTotalDenominacion = entry.getKey().getValor().multiply(new BigDecimal(cantidadDen.intValue()));
			
			bdTotalSumDenominacion = bdTotalSumDenominacion.add(bdTotalDenominacion);
		}
		
		BigDecimal bdTotalDivisa = UtileriaVista.obtenerBigDecimal(this.txtTotalDivisa);
		
		BigDecimal bdDiferencial = bdTotalDivisa.subtract(bdTotalSumDenominacion);
		if(modoCrear)
		{
			if(invocador.equals(Invocador.DIVISA))
			{
				if(bdTotalSumDenominacion.longValue() == 0.0)
				{
					bdDiferencial = bdTotalDivisa;
				}
				else
				{
					bdDiferencial = bdTotalDivisa.subtract(bdTotalSumDenominacion);
				}
			}
			else if(invocador.equals(Invocador.DENOMINACION))
			{
				if(bdTotalSumDenominacion.compareTo(bdTotalDivisa) == 1)
				{
					this.txtTotalDivisa.setValue(bdTotalSumDenominacion.toString());
					bdDiferencial = new BigDecimal("0.0");
				}
				else
				{
					bdDiferencial = bdTotalDivisa.subtract(bdTotalSumDenominacion);
				}
			}
		}
		
		this.txtDiferencial.setValue(bdDiferencial.toString());		
		
	}

	public Map<Denominacion, ManejadorDenominacion2> getMpDenominaciones() {
		return mpDenominaciones;
	}

	public boolean isModoCrear() {
		return modoCrear;
	}
	
	public void setModoCrear(boolean modoCrear) {
		this.modoCrear = modoCrear;
	}

	public enum Invocador
	{
		DIVISA,DENOMINACION
	}

	public void setInvocador(Invocador invocador) {
		this.invocador = invocador;
	}
	
}
